/**
 * Copyright (C), 2018-2018
 * FileName: SecurityConfig  * Author:   lcsos
 * Date:     2018/10/8 20:54
 * Description:
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.spring.security.cofig;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * 〈一句话功能简述〉<br>  
 *
 *
 * @author Lcs
 * @create 2018/10/8 
 * @since 1.0.0
 */

//@EnableWebSecurity 自带 @Configuration注解
//SecurityConfig配置类，继承WebSecurityConfigurerAdapter，开启 @EnableWebSecurity
@EnableWebSecurity//开启web的安全模式
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    //定义授权规则
    @Override
    public void configure(HttpSecurity http) throws Exception {
//        super.configure(web);
        //定制请求的授权规则
        //http.authorizeRequests() 授权请求
        //.antMatchers(路径模式) 什么样的请求
        //.permitAll() .hasRole("VIP1") 什么权限可以访问
        http.authorizeRequests().antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("VIP1")
                .antMatchers("/level2/**").hasRole("VIP2")
                .antMatchers("/level3/**").hasRole("VIP3");

        //开启自动配置的登录功能，效果：如果没有登录，没有权限就会来到登录页面
        //.loginPage() 告诉security登录页是发送什么请求
        http.formLogin().usernameParameter("user").passwordParameter("pwd")
                .loginPage("/userlogin");
        //1、 /login 来到登录页
        //2、 重定向到 /login?error 表示登陆失败
        //3、 更多详细功能
        //4、 默认post形式的/login代表处理登录
        //5、 一旦定制loginPage：那么 loginPage的post请求就是登陆

        //开启自动配置的注销规则
        //定制退出规则，注销成功以后来到首页
        http.logout().logoutSuccessUrl("/");
        //1、 访问 /logout 表示用户注销 清空session
        //2、 注销成功则会返回 /login?logout 页面

        //开启记住我功能
        http.rememberMe().rememberMeParameter("remeber");

    }

    //定义认证规则
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        super.configure(auth);
        //.jdbcAuthentication()连接数据库的
        //inMemoryAuthentication() 在内存中
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("liu").password(new BCryptPasswordEncoder().encode("123456")).roles("VIP1","VIP2")
                .and()
                .withUser("wei").password(new BCryptPasswordEncoder().encode("123456")).roles("VIP2","VIP3")
                .and()
                .withUser("jiang").password(new BCryptPasswordEncoder().encode("123456")).roles("VIP1","VIP3");
    }
}
